package com.blumov.fastbox.infrastructure.persistence.largequery;

import org.hibernate.Criteria;
import org.hibernate.Query;

/**
 * 
 * @author fernandop
 *
 */
public class Page {
	private static final String CANT_PAGINA = "cantPagina";

	private static final String NRO_PAGINA = "nroPagina";

	/**
	 * primera pagina
	 */
	private static final Integer FIRST_PAGE_NUMBER = new Integer(1);

	/**
	 * Numero de pagina
	 */
	private int number;
	
	/**
	 * Tamanio de la pagina (en cantidad de registros)
	 */
	private int size;
	
	
	public Page() {
	}
	/**
	 * Full constructor
	 * @param number Numero de pagina
	 * @param size Tamanio de la pagina (en cantidad de registros)
	 */
	public Page(int number, int size) {
		this();
		this.number = number;
		this.size = size;
	}
	
	/**
	 * 
	 * @return Posicion del primer elemento de la pagina en el listado general 
	 */
	int getFirstPosition() {
		return size * (number - 1);
	}
	
	
	/**
	 * @return el numero de la pagina
	 */
	public int getNumber() {
		return number;
	}
	
	public void setNumber(int number) {
		this.number = number;
	}
	
	/**
	 * @return el tamaño de la pagina
	 */
	public int getSize() {
		return size;
	}
	
	public void setSize(int size) {
		this.size = size;
	}
	public boolean isFirstPage() {
		return FIRST_PAGE_NUMBER.equals(getNumber());
	}
	
	/**
	 * page set to thisQuery
	 * @param thisQuery
	 */
	public void setTo(Query thisQuery) {
		thisQuery.setParameter(NRO_PAGINA, number);
		thisQuery.setParameter(CANT_PAGINA, size);
	}
	/**
	 * page set to thisCriteria
	 * @param thisCriteria
	 */
	public void setTo(Criteria thisCriteria) {
		thisCriteria.setFirstResult(getFirstPosition());
		thisCriteria.setMaxResults(size);
	}
	public void setToQuery(Query thisQuery) {
		thisQuery.setFirstResult(getFirstPosition());
		thisQuery.setMaxResults(size);
	}

}
